# -*- coding: utf-8 -*-
from django import forms
from django.utils.translation import ugettext_lazy as _

from django.contrib.auth.models import User
from apps.amway.models import Producto, Cliente, ProductosCliente, PreciosProducto, VentaCliente,  \
                              Inventario, HistorialInventario, PagosCliente, TipoTransaccion, Nota, FlujoCaja
from apps.l10n.models import City, AdminArea
################################################################################
date_dict = { 'id' : 'datepicker', 'autocomplete' : 'off'  }
nombre_cliente_dict = {'id' : 'nombrecliente'}
depto_dict = {'id' : 'departamento'}
ciudad_dict = {'id' : 'ciudad'}
prod_dict = {'id' : 'productos', 'size' : '35' }
################################################################################
class AddClienteForm(forms.Form):
    
    def __init__(self, *args, **kwargs):
        super(AddClienteForm, self).__init__(*args, **kwargs)
        #self.fields['departamento'].choices = [('','----------')] + [(d.codigo, d.nombre) for d in Departamento.objects.all().order_by('nombre')]
        self.fields['departamento'].choices = [('0','----------')] + [(d.id, d.name) for d in AdminArea.objects.filter(country__numcode=170).order_by('name')]
        self.fields['ciudad'].choices = [('0','----------')]       
        
    nombre = forms.CharField(max_length=100)
    apellido = forms.CharField(max_length=100, required=False)
    email = forms.EmailField(required=False)
    telefono = forms.CharField(required=False)
    movil = forms.CharField(required=False)
    fecha_nacimiento = forms.DateField(widget=forms.TextInput(attrs=date_dict), required=False)
    departamento = forms.ChoiceField(widget=forms.Select(attrs=depto_dict))
    ciudad = forms.ModelChoiceField(City.objects, widget=forms.Select(attrs=ciudad_dict))
    
    
    def save(self, usuario):        
        cod_cliente = Cliente.objects.set_codigo(usuario)        
        ciudad = City.objects.select_related().get(pk=int(self.cleaned_data['ciudad'].codigo))
        departamento = ciudad.admin_area
        pais = departamento.country
        activo = 1
        
        cliente = Cliente.objects.create(codigo=cod_cliente, nombre = self.cleaned_data['nombre'],
                                         apellido =self.cleaned_data['apellido'], email=self.cleaned_data['email'],
                                         telefono=self.cleaned_data['telefono'], movil=self.cleaned_data['movil'], 
                                         fecha_nacimiento=self.cleaned_data['fecha_nacimiento'], activo=activo, usuario=usuario,
                                         pais=pais, departamento=departamento, ciudad=ciudad)              
################################################################################
class EditClienteForm(forms.Form):
    
    def __init__(self, *args, **kwargs):
        super(EditClienteForm, self).__init__(*args, **kwargs)
        self.fields['departamento'].choices = [('0','----------')] + [(d.codigo, d.nombre) for d in Departamento.objects.all().order_by('nombre')]
        self.fields['ciudad'].choices = [('0','----------')]   
    
    nombre = forms.CharField(max_length=100)
    apellido = forms.CharField(max_length=100)
    email = forms.EmailField(required=False)
    telefono = forms.CharField(required=False)
    movil = forms.CharField(required=False)
    fecha_nacimiento = forms.DateField(widget=forms.TextInput(attrs=date_dict))
    departamento = forms.ChoiceField(widget=forms.Select(attrs=depto_dict))
    ciudad = forms.ModelChoiceField(City.objects, widget=forms.Select(attrs=ciudad_dict), required=False)   
    
    def datos_cliente(self, cod_cliente):
        cliente = Cliente.objects.get_datos_cliente(cod_cliente)
        self.fields['nombre'].initial = cliente.nombre
        self.fields['apellido'].initial = cliente.apellido
        self.fields['email'].initial = cliente.email
        self.fields['telefono'].initial = cliente.telefono
        self.fields['movil'].initial = cliente.movil
        self.fields['fecha_nacimiento'].initial = cliente.fecha_nacimiento
        
    ############################################################################
    def save(self, cod_cliente, usuario):        
        ciudad = City.objects.select_related().get(pk=int(self.cleaned_data['ciudad'].codigo))
        departamento = ciudad.admin_area
        pais = departamento.country     
        activo = 1
        
        cliente = Cliente.objects.get(pk=cod_cliente, usuario=usuario)
        cliente.nombre = self.cleaned_data['nombre']
        cliente.apellido =self.cleaned_data['apellido']
        cliente.email=self.cleaned_data['email']
        cliente.telefono=self.cleaned_data['telefono']
        cliente.movil=self.cleaned_data['movil']
        cliente.fecha_nacimiento=self.cleaned_data['fecha_nacimiento']
        cliente.pais=pais
        cliente.departamento=departamento
        cliente.ciudad=ciudad        
        cliente.save()
################################################################################
class AddProductoClienteForm(forms.Form):
    
    producto = forms.CharField(widget=forms.TextInput(attrs=prod_dict), help_text='Escriba el nombre del producto o las iniciales, se desplegara una lista con las coincidecias.')
    fecha = forms.DateField(widget=forms.TextInput(attrs=date_dict))
    cantidad = forms.CharField()
    cliente = forms.CharField(widget=forms.HiddenInput())
    obsequio = forms.BooleanField(widget=forms.CheckboxInput(), required=False)
    
    def cliente_init_val(self, cliente_id):
        self.fields['cliente'].initial = cliente_id       

    def clean(self):
        
        producto = self.cleaned_data.get('producto')
        cliente = self.cleaned_data.get('cliente')
        print self.cleaned_data.items()
        if producto and cliente:
            
            customer = Cliente.objects.get(codigo__exact=cliente)
            
            try:
                producto_inventario = Inventario.objects.get(producto__descripcion__iexact=producto, usuario=customer.usuario)
                
                if producto_inventario.existencias <= 0:
                    raise forms.ValidationError(_(u'No tiene existencias de este producto en su Inventario'))
                    
            except Inventario.DoesNotExist:
                raise forms.ValidationError(_(u'Este producto no existe en su Inventario'))
                
        return self.cleaned_data
  
    def save(self, cliente_id):
        
        fecha  = self.cleaned_data['fecha']
        cantidad = int(self.cleaned_data['cantidad'])
        obsequio = self.cleaned_data['obsequio']
        producto = self.cleaned_data.get('producto')
        cliente = Cliente.objects.get(codigo__exact=cliente_id)        
        inventario = Inventario.objects.select_related().get(producto__descripcion__iexact=producto, usuario=cliente.usuario)         
        precio = PreciosProducto.objects.get_precio_x_fecha(producto, fecha)        
        valor = int(precio) * cantidad  
        valor_actual = int(inventario.valor)
        inventario.existencias -= cantidad
        nuevo_valor = valor_actual - valor
        inventario.valor = nuevo_valor
        
        if obsequio == True:
            valor = 0
            tipo_transaccion = TipoTransaccion.objects.get(pk=9)
            
        else:
            tipo_transaccion = TipoTransaccion.objects.get(pk=2)
            
        try:
            venta = VentaCliente.objects.set_valor_saldo(cliente, valor)
        except VentaCliente.DoesNotExist:
            venta = VentaCliente.objects.create(cliente=cliente, valor=valor, saldo=valor, usuario=cliente.usuario)
            
        producto_cliente = ProductosCliente.objects.create(fecha_entrega=fecha, producto=inventario.producto, cliente=cliente, cantidad=cantidad)
        historial_inventario = HistorialInventario.objects.create(fecha=fecha, inventario=inventario, transaccion=tipo_transaccion, cantidad=cantidad, usuario=cliente.usuario)
        inventario.save()
###############################################################################
class AddPagoClienteForm(forms.Form):
    
    fecha = forms.DateField(widget=forms.TextInput(attrs=date_dict))
    valor = forms.CharField()
    cliente = forms.CharField(widget=forms.HiddenInput())
    
    def cliente_init_val(self, cliente_id):
        self.fields['cliente'].initial = cliente_id        
        
    def clean(self):
        valor = self.cleaned_data.get('valor')
        cliente = self.cleaned_data.get('cliente')
        
        if valor and cliente:
            venta_cliente = VentaCliente.objects.get(cliente=cliente)
            saldo = int(venta_cliente.saldo) - int(valor)
            
            if saldo < 0:
                raise forms.ValidationError(_(u'No puede haber saldo negativo, el valor ingresado es mas alto que el saldo actual, saldo actual: $%s valor ingresado: $%s ') %(venta_cliente.saldo, valor))
                
        return self.cleaned_data            
    
    def save(self, cliente_id):
        fecha = self.cleaned_data['fecha']
        valor = int(self.cleaned_data['valor'])        
        venta_cliente = VentaCliente.objects.select_related().get(cliente=cliente)
        saldo_flujo_caja = FlujoCaja.objects.get_last_balance(venta_cliente.cliente.usuario)
        
        if valor != 0:
            saldo = int(venta_cliente.saldo) - valor
            nuevo_saldo_flujo_caja = saldo_flujo_caja + valor
            pago_cliente = PagosCliente.objects.create(fecha_pago=fecha, valor_pagado=valor, cliente=venta_cliente.cliente)
            descripcion = u'Abono de Cliente: %s' %cliente
            debe = 0             
            flujo_caja = FlujoCaja.objects.create(saldo=nuevo_saldo_flujo_caja, haber=valor, debe=debe,
                                                   descripcion=descripcion, fecha=fecha, usuario=venta_cliente.cliente.usuario)            
            venta_cliente.saldo = saldo
            venta_cliente.save()
################################################################################
class AddNotaClienteForm(forms.Form):
    
    asunto = forms.CharField()
    contenido = forms.CharField(widget=forms.Textarea())
    fecha = forms.DateField(widget=forms.TextInput(attrs=date_dict))
    
    def save(self, cliente_id):
        cliente = Cliente.objects.get(pk=cliente_id)
        nota = Nota.objects.create(asunto=self.cleaned_data['asunto'], contenido=self.cleaned_data['contenido'],
                                   fecha=self.cleaned_data['fecha'], cliente=cliente)        
################################################################################